我想从一个你一定熟悉的概念说起:函数。还记得中学数学课上,老师在黑板上写下的那个公式吗?
y=f(x)y = f(x)
这是函数的标准形式。给定一个输入x,通过某种规则f进行计算,得到输出y。简单,明了,优雅。那时我们学的函数,大多数是这样的:
y=2x+3y = 2x + 3y=x2y = x^2y=sin(x)y = \sin(x)
规则简单,输入输出的关系一目了然。但函数的力量,远不止于此。ChatGPT,从数学上讲,也是一个函数:
回答=ChatGPT(问题)\text{回答} = \text{ChatGPT}(\text{问题})
你输入一个问题(输入x),ChatGPT执行某种计算(函数f),然后返回一个回答(输出y)。
这不是比喻,不是类比,而是数学意义上的精确描述。ChatGPT就是一个函数——只不过,是一个极其复杂的函数。
但ChatGPT和我们在中学学的函数,有一个本质的区别。中学的函数,参数通常只有几个:
y=2x+3y = 2x + 3
这里只有2个参数:系数"2"和常数"3"。而ChatGPT呢?它有1750亿个参数。 1750亿。这是一个什么概念?
我第一次看到这个数字的时候,也被震撼了。我们究竟在和一个什么样的"函数"打交道?
换个角度想,一个拥有1750亿参数的模型,它是怎么"理解"你的问题,又是怎么"组织"出回答的?
为了回答这个问题,我们可以把ChatGPT想象成一个巨大的控制面板。面板上密密麻麻排列着1750亿个旋钮,每个旋钮都可以调节,每个旋钮的位置都会影响最终的输出。
回答=f(问题,θ1,θ2,θ3,...,θ175000000000)\text{回答} = f(\text{问题}, \theta_1, \theta_2, \theta_3, ..., \theta_{175000000000})
这1750亿个旋钮(参数),共同决定了ChatGPT如何理解语义、如何组织逻辑、如何选择措辞。
Note
关于参数数量的说明
本书中我们主要以GPT-3的1750亿参数作为讲解示例。
为什么不用最新的GPT-5.2?
因为OpenAI从GPT-4开始就不再公开参数量等技术细节,而GPT-3是最后一个公开详细技术参数(96层网络、12288维嵌入等)的模型。GPT-3.5(与GPT3同源,是ChatGPT最初版本的基座)虽然也很重要,但它的参数量同样未公开,估计在1750亿左右。1750亿这个确切的数字,能让你更直观地理解这些概念。
不过请放心,所有GPT模型的核心原理是完全一致的——无论是1750亿参数还是现在万亿级别的参数,它们的工作机制都是相同的。而且以现在人类对Transformer架构的痴迷(后面你会了解Transformer,以及为什么我说是"痴迷"),短期内模型机制不会有太大的变化。
说到这里,你可能会问:这些"参数"到底是什么?为什么要有这么多?
让我直接告诉你:参数是存储知识的容器。
每个参数(准确说是参数的组合)编码了语言的某种规律:
每一种语言现象,每一点世界知识,都需要一些参数来存储和表达。
现在,关键问题来了:为什么需要这么多参数?
答案很简单,也很深刻:因为语言太复杂了。
让我给你举几个例子,感受一下语言的复杂性。
"这本书很重"(重量大)
"这件事很重要"(重要)
同一个"重"字,在不同语境下,意思完全不同。人类当然能够理解,但是模型需要参数来捕捉这种微妙的差异。
所谓指代消解,就是判断代词(如"他"、"它"、"这个"等)具体指代什么。这在人类看来很自然,但对计算机是一个复杂的推理问题。比如:
“小明买了一个苹果手机。它的屏幕很大。”
"它"指的是什么?是苹果手机,不是小明,也不是水果苹果,而是指iPhone手机。模型需要参数来追踪这种指代关系。
"他把玻璃杯掉在地上,碎了。"
什么碎了?是玻璃杯,不是地板。这需要常识:玻璃杯易碎,地板不易碎。模型需要参数来存储这些常识。
"你能把窗户关上吗?"
这表面上是一个疑问句,实际上是一个请求,甚至隐含着不耐烦的情绪。模型需要参数来理解这些语用规则,甚至需要结合上下文,能推测出是否有不耐烦的情绪。
这还只是最表面的复杂性。
语言的世界里,近义词之间有微妙的差异,同一个词在不同语境下意思完全不同。还有成语俗语背后的文化典故,医学、法律这些专业领域的术语……更别说人说话时的那种感觉,褒义贬义、正式口语,模型都得学会分辨。
每一个维度,都需要大量参数来捕捉。
有人做过一个粗略的估算:人类语言中有数十万个词汇,数百万种常见的词语搭配,数千万个事实性知识,数亿种可能的句子结构……要让模型"理解"这一切,1750亿个参数,可能还不够。
既然ChatGPT是一个函数,有1750亿个参数需要确定,那为什么不能像我们在学校学的那样,用解方程组的方法来求解这些参数呢?
这是一个极好的问题。让我详细解释为什么不能。
先回顾一下中学的解方程组是怎么做的:
假设我们有一个函数:y=ax+by = ax + b。我们的目标是求出参数 aa 和 bb:
第1步:根据已知条件列方程
已知条件:
可以列出方程组:
{5=a⋅1+b7=a⋅2+b\begin{cases} 5 = a \cdot 1 + b \ 7 = a \cdot 2 + b \end{cases}
第2步:直接求解
用消元法,直接算出:a=2a = 2,b=3b = 3
完成!我们找到了精确的参数值。那么,能用同样的方法求ChatGPT的参数吗?不太实际。有以下几个问题。
中学的方程组是线性的:2x+3y=102x + 3y = 10
但ChatGPT的"方程"是96层嵌套的非线性系统:
输出=第96层(...第2层(第1层(输入)))\text{输出} = \text{第96层}(...\text{第2层}(\text{第1层}(\text{输入})))
其中每一层都有数十亿个参数,且包含ReLU这样的非线性转换。这是一个极度复杂的非线性系统,没有解析解(就是没有公式可以直接算出答案)。
Note
术语说明:什么是线性和非线性?
线性:输入和输出成正比关系。比如买水果:
非线性:输入和输出的关系有转折。比如:
那为什么ChatGPT需要非线性?
因为语言规律不是简单的正比关系。比如"喜欢"这个词:
同一个词,不同语境意思完全不同。这种复杂关系必须用非线性函数来表达。
即使理论上能列出方程组,求解1750亿个未知数的方程组:
传统方法(如高斯消元法)的计算复杂度是 O(n3)O(n^3)。对于1750亿,就是 (1750亿)3(1750\text{亿})^3 的计算量。这个数字大到宇宙中的原子数都不够用来计数
| 中文 | English | 音标 | 说明 |
|---|---|---|---|
| 函数 | Function | /ˈfʌŋkʃən/ | 输入到输出的映射关系 |
| 参数 | Parameter | /pəˈræmɪtər/ | 模型中可学习的权重和偏置 |
| 大模型 | Large Language Model (LLM) | /lɑːdʒ ˈlæŋɡwɪdʒ ˈmɒdl/ | 基于海量数据训练的神经网络语言模型 |
| 线性 | Linear | /ˈlɪniər/ | 输入输出成正比,可加可乘的简单关系 |
| 非线性 | Nonlinear | /nɒnˈlɪniər/ | 输入输出有转折和拐弯的复杂关系 |
| 一词多义 | Polysemy | /pəˈlɪsəmi/ | 同一词语在不同语境中含义不同 |
| 指代消解 | Anaphora Resolution | /əˈnæfərə ˌrezəˈluːʃən/ | 判断代词(他/它/这个)具体指代什么 |
| 语用学 | Pragmatics | /præɡˈmætɪks/ | 研究语境如何影响语言的理解和使用 |
| 分布式编码 | Distributed Representation | /dɪˈstrɪbjuːtɪd ˌreprɪzenˈteɪʃən/ | 知识分散在一组参数组合中而非一对一存储 |
| 解析解 | Closed-form Solution | /kləʊzd fɔːm səˈluːʃən/ | 可以直接用公式算出的精确数学解 |
| 非线性系统 | Nonlinear System | /nɒnˈlɪniər ˈsɪstəm/ | 输出与输入不成正比的复杂系统 |
| 激活函数 | Activation Function | /ˌæktɪˈveɪʃən ˈfʌŋkʃən/ | 引入非线性的关键数学操作,如ReLU |